import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;

public class Main {
    public static void main(String[] args) throws InterruptedException, IOException {
       // test01();
        // 这个不算是一个测试用例
        // 因为： 测试用例是要有预期的， 这里面是没有预期的

        //test02();

        //test04();
        
       // test05();

      //  test06();

     //   test07();

      //  test08();
        
       // test09();
       // page01();
       // page02();
        // page03();
       // page04();
       // page05();

       // test10();
        test11();

        test12();
    }

    // 截图操作
    private static void test12() throws InterruptedException, IOException {
        // 需要添加响应的 maven 依赖
        // 在maven 中央仓库中 搜索 common-io 然后选择第一个， 再选择使用量高的 ， 然后 添加依赖
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 接下来进行截图操作
        File file = ((TakesScreenshot) (webDriver)).getScreenshotAs(OutputType.FILE); // 截图的值
        // 保存到硬盘当中
        FileUtils.copyFile(file, new File("D://20240316.png"));
    }

    //切换窗口
    private static void test11() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(3000);
        // 1. 先去获取当前页面资源, 通过 getWindowHandles() 所有的窗口句柄
        // getWindowHandle() 是 获取当前页面的窗口句柄
        // 不同页面如果有 相同的 id 名字 是不会起 冲突的， 因为获取的页面地址不一样
        Set<String> handles = webDriver.getWindowHandles();
        // 接下来进行遍历操作
        String target = "";
        for (String handle:handles) {
            target = handle; // 每一次遍历， 都可以拿到 对应的 handle 了， （网页连接） （想要进入新窗口， 就必须要获取到网页连接）
            // 这里面遍历完之后 target 获取的就是最后一个 handle 元素
        }
        webDriver.switchTo().window(target); // 通过这样的一个操作，就可以在新的页面中寻找元素了
        // id 重复了也没有关系
        sleep(3000);
        // 首先要先定位输入框， 还有点击搜索的位置的框
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
        // 进入到新的页面
        // 还需要对页面进行切换操作



    }

    // 关闭浏览器操作
    private static void test10() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        // 里面传入 前端页面指定的连接的位置的 地方 右键 copy 选择 copy selector 选项
        // 这里是传入 百度页面 新闻模块的 选择器
        sleep(4000);
       // webDriver.quit(); // 关闭浏览器
        webDriver.close(); // 关闭浏览器
        // 这两者之间的区别
    }

    // 上传文件
    private static void page05() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get(""); // 这里面填写要进入的网页连接
        // 文件上传
        webDriver.findElement(By.cssSelector("input")).sendKeys(""); // 对 input 标签进行操作
        // sendKeys("") 里面写入要上传的文件路径

    }

    // 针对 alert 操作
    private static void page04() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get(""); // 这里面填写要进入的网页连接
        webDriver.findElement(By.cssSelector("button")).click(); // 选中对应的元素 button 标签 ， 并点击
        sleep(3000);
        // alert 弹窗取消
        webDriver.switchTo().alert().dismiss();
        // 点击 按钮
        webDriver.findElement(By.cssSelector("button")).click(); // 选中对应的元素 button 标签 ， 并点击

        // 在 alert 弹窗中输入内同
        webDriver.switchTo().alert().sendKeys("你好");
        // alert 弹窗确认
        sleep(3000);
        webDriver.switchTo().alert().accept();
    }

    private static void page03() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get(""); // 这里面填写要进入的网页连接
        WebElement element = webDriver.findElement(By.cssSelector("")); // 这里面写 前端 select 标签 里面 id 属性的值, 也是前端的属性
        Select select = new Select(element);  // 借助 Select 来完成下拉框的定位
        select.selectByIndex(3);// 通过下表来定位 ， 下表 从 0 开始
        select.deselectByValue("12.51"); // 通过 值来定位 ， "" 这里面填写源码里面 value 属性对应的值
    }


    // 多层框架/窗口定位
    private static void page02() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get(""); // 这里面填写要进入的网页连接
        webDriver.switchTo().frame(""); // "" 这里面填写前端页面的 iframe 对应的 id 值
        webDriver.findElement(By.cssSelector("")).click(); // "" 这里面填写前端对应的 selector

    }

    // 定位一组元素
    private static void page01() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("");
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS); // 智能隐式等待
        List<WebElement> elements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < elements.size(); i++) {
            // 如果每个元素 type 等于 checkbox 进行点击
           // getAttribute 是为了获取页面上的元素对应的属性值， 当前的 type 是当前元素属性
            if (elements.get(i).getAttribute("type").equals("checkbox")) {
                elements.get(i).click();
            }else {
                // 否则什么也不操作

            }
        }
    }

    private static void test09() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        // 找到图片按钮
        WebElement element = webDriver.findElement(By.cssSelector("图片")); // 图片 这里的参数是错的
        // 鼠标右击
        Actions actions = new Actions(webDriver);
        sleep(3000);
        actions.moveToElement(element).contextClick().perform();
    }

    private static void test08() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        // 搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        // control + A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
        sleep(3000);
        // control+X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
        sleep(3000);

        // control + V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
        sleep(3000);
        
    }

    // 浏览器操作
    private static void test07() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        // 搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        // 强制等待3s
        webDriver.findElement(By.cssSelector("#su")).click();
        // 浏览器后退操作
        sleep(3000);
        webDriver.navigate().back();
        sleep(3000);
        // 强制等待3s
        webDriver.navigate().refresh(); // 刷新
        // 浏览器前进
        sleep(3000);
        webDriver.navigate().forward();


        // 浏览器滚动条的操作
        sleep(3000);
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        webDriver.manage().window().maximize();
        sleep(3000);
        webDriver.manage().window().fullscreen();
        sleep(3000);
        webDriver.manage().window().setSize(new Dimension(600,1000));

    }

    private static void test06() {
        // 创建驱动
        WebDriver webDriver = new ChromeDriver();

        // 打开百度首页
        webDriver.get("https://www.baidu.com");

        // 隐式代码等待  3s
        // 判断元素是否可以被点击
        WebDriverWait wait = new WebDriverWait(webDriver,3000);
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#su")));
        wait.until(ExpectedConditions.titleIs("百度一下，你就知道"));


    }

    private static void test05() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");

        String url = webDriver.getCurrentUrl(); // 获取 url
        String title = webDriver.getTitle(); // 获取 title
        if (url.equals("https://www.baidu.com/") && title.equals("百度一下，你就知道")){
            System.out.println("测试通过");
        }else {
            System.out.println("url: "+url);
            System.out.println("title: "+title);
            System.out.println("测试不通过");
        }
    }

    private static void test04() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        String value = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        if(value.equals("百度一下")){
            System.out.println("测试通过");
        }else {
            System.out.println(value);
            System.out.println("测试不通过");
        }

    }

    private static void test02() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        // 找到百度搜索输入框， 输入“”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("nihao");
        // 抓取 kw 标签属性

        // 点击了一下百度按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        // sleep(1000); //（强制等待）

        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS); // 隐式等待
        // 3 为时长， TimeUnit.DAYS 后面这个表示单位， 有 日期， 有分钟， 有小时， 有秒

        WebDriverWait wait = new WebDriverWait(webDriver,3000);
        //wait.until(ExpectedConditions.titleIs());

        // 清空百度搜索输入框中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }


    public static void test01() throws InterruptedException {
        int flag = 0;

        ChromeOptions options = new ChromeOptions(); // ChromeOptions 这个相当与创建一个选项， 创建了一个对象
        options.addArguments("--remote-allow-origins=*"); // 最重要的是这里
        // "--remote-allow-origins=*" 此时给这个选项加了一个参数
        // 这个参数 允许所有 请求， 可以访问全部页面
        // 创建驱动的时候 需要先把这两行代码写上， （这是因为做了升级）

        //
        WebDriver webDriver = new ChromeDriver(options);
        // 这里相当于打开了一个 百度网页， 这就是测试自动帮我们做的事情
        webDriver.get("https://www.baidu.com");
        // 找到百度搜索输入口框
        // 要拿着这个 webDriver 驱动来操作
        // findElement
        //  webDriver.findElement(By.cssSelector('.s_ipt')); // 这个cssSelector是 css的类选择器， 有三个自己查阅
        //WebElement webElement = webDriver.findElement(By.cssSelector(".s_ipt")); // 返回类型 是 WebElement
        // 输入软件测试
        // webElement.sendKeys("软件测试");

        //上面是 css 操作， 去找的

        // 接下来 通过 xpath 操作来找
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        // 这里面的参数是在页面中的控制台里面 找到你要测试的位置 ，然后右键 找到 Copy 属性， 里面有xpath 参数 ， 复制过来粘贴到这里面
        element.sendKeys("软件测试");

        // 这里需要掌握 一些 css 的基本语法

        // 以上的代码不算是一种测试用例

        // 接下来这样写

        // 先找到 百度一下 按钮
        // 点击
        webDriver.findElement(By.cssSelector("#su")).click(); // click 通过这个方法来出发点击事件
        sleep(3000); // 等待三秒

        // 校验
        // 第一步 找到搜索结果
        List<WebElement> elements = webDriver.findElements(By.cssSelector("a em"));// 找到的是一批元素, 此处以 a em 为例
        for (int i = 0; i < elements.size(); i++) {
           // System.out.println(elements.get(i).getText());   // 通过 getText() 这个方法来获取 网页文本。

            // 如果返回的结果有软件测试，证明通过， 否则测试不通过
            if(elements.get(i).getText().equals("测试")){
                System.out.println(elements.get(i).getText());
                flag = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if(flag == 0){
            System.out.println("测试不通过");
        }
    }

}
